#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include <sys/shm.h>
#include <string.h>

int main(){
	//key_t  实际就是 int
	key_t key;
	int shmid;
	char * buf;

	//1. 生成key
	key = ftok("keytest", 100);
	if(key < 0){
		perror("ftok");
		return 0;
	}
	printf("key=0x%x, %d\n", key, key);

	//2. 在内核空间打开共享内存
	shmid = shmget(key, 512, 0666);
	if(shmid < 0){
		perror("shmget");
		return 0;
	}
	printf("shmid=0x%x, %d\n", shmid, shmid);

	//3. 映射共享内存到进程的地址空间, 0表示可读写
	buf = shmat(shmid, NULL, 0);
	if(buf < 0){
		perror("shmat");
		return 0;
	}

	//4. 从共享内存里读出数据
	printf("read buf from systemV : %s\n", buf);

	//5.撤销共享内存的映射。
	//当该程序一直在运行不退出，若不执行这一行，则ipcs状态会加1,后续因为状态不为0,共享内存也无法被删除。
	shmdt(buf);

	//6. 删除共享内存对象
	shmctl(shmid, IPC_RMID, NULL);
}
